/**
 * @description 查询模板
 */

const { findOneWork, findWorkList } = require('../../service/works')
const { publicTemplatesCacheGet, publicTemplatesCacheSet } = require('../../cache/works/templates')
const { findOneWorkFailInfo, findOneWorkDbErrorFailInfo } = require('../../res-model/failInfo/index')
const { ErrorRes, SuccessRes } = require('../../res-model/index')

/**
 * 隐藏手机号
 * @param {string} number 手机号
 */
function hidePhoneNumber(number = '') {
  const n = number.toString()

  if (!n) return n

  const reg = /^1[3456789]\d{9}$/ // 手机号正则
  if (reg.test(n) === false) return n

  return n.slice(0, 3) + '****' + n.slice(-4) // eslint-disable-line
}

/**
 * 格式化公共的模板数据，隐藏一些信息
 * @param {object|Array} template 模板数据
 */
function formatTemplate(template = {}) {
  if (Array.isArray(template)) {
    // 传入了 list
    return template.map(t => formatTemplate(t))
  }

  // 传入了单个 template
  const result = template

  // 用户名若是手机号，则隐藏手机号
  result.author = hidePhoneNumber(result.author)
  if (result.user && result.user.username) {
    const user = result.user
    user.username = hidePhoneNumber(user.username)
  }

  return result
}

/**
 * 查询公共模板
 * @param {object} queryInfo 查询条件
 */
async function findPublicTemplates(queryInfo = {}) {
  const { title, pageIndex, pageSize } = queryInfo

  const pageOpt = {
    ...(pageIndex && { pageIndex: parseInt(pageIndex) }),
    ...(pageSize && { pageSize: parseInt(pageSize) })
  }

  // 试图从 cache 中获取
  const templatesFromCache = await publicTemplatesCacheGet(queryInfo, pageOpt)
  if (templatesFromCache != null) {
    // 从缓存中获取
    return new SuccessRes(templatesFromCache)
  }

  const whereOpt = {
    isTemplate: true,
    isPublic: true, // 公开的
    ...(title && { title: { $regex: title, $options: 'i' } }) // mongoose $regex 正则表达式查询  $options: 'i' 忽略大小写
  }

  // 缓存中没有，从数据库获取
  const res = await findWorkList(whereOpt, pageOpt)

  // 格式化模板
  const formatList = formatTemplate(res.list)

  // 记录到缓存
  publicTemplatesCacheSet(queryInfo, pageOpt, { ...res, list: formatList })

  // 返回
  return new SuccessRes({ ...res, list: formatList })
}

/**
 * 查询单个作品
 * @param {string} id workId
 */
async function findOneTemplate(id) {
  if (!id) return new ErrorRes(findOneWorkFailInfo, 'id 为空')

  try {
    const template = await findOneWork({
      id,
      isTemplate: true,
      isPublic: true // 公开的
    })
    // 查询失败
    if (template == null) {
      return new ErrorRes(findOneWorkFailInfo)
    }
    // 格式忽视
    const res = formatTemplate(template)

    // 查询成功
    return new SuccessRes(res)
  } catch (ex) {
    console.error('查询单个模板', ex)
    return new ErrorRes(findOneWorkDbErrorFailInfo) // 数据库错误
  }
}

module.exports = {
  findPublicTemplates,
  findOneTemplate
}
